package cn.iocoder.yudao.adminserver.framework.rocketmq;

import cn.iocoder.yudao.adminserver.framework.rocketmq.conf.RocketMqConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

/**
 * 生产者
 *
 * @Author: 王文龙
 * @Date: 2020/7/239:45
 * @Version: 1.0
 * @Describe: 描述:
 */
@Slf4j
@Component
public class Producer {

    /**
     * 消息的生产者
     *
     * @Describe: 这个类是应用程序打算发送信息的入口点
     */
    private DefaultMQProducer defaultMQProducer;

    /**
     * 注入消息的配置
     */
    @Resource
    private RocketMqConfig rocketMqConfig;


    /**
     * @Describe: @PostConstruct注解：被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行，并且只会被服务器调用一次，类似于Serclet的inti()方法。
     * 被@PostConstruct修饰的方法会在构造函数之后，init()方法之前运行。
     */
    @PostConstruct
    public void init() throws MQClientException {
        this.defaultMQProducer = new DefaultMQProducer(rocketMqConfig.getProducerGroup());
        defaultMQProducer.setNamesrvAddr(rocketMqConfig.getNamesrvAddr());
        defaultMQProducer.setInstanceName(rocketMqConfig.getInstanceName());
        //关闭VIP通道，避免出现connect to <:10909> failed导致消息发送失败
        defaultMQProducer.setVipChannelEnabled(false);
        defaultMQProducer.start();
        log.info("RocketMq Producer start success");
    }

    /**
     * @Describe: @PreConstruct注解： 被@PreConstruct修饰的方法会在服务器卸载Servlet的时候运行，并且只会被服务器调用一次，
     * 类似于Servlet的destroy()方法。被@PreConstruct修饰的方法会在destroy()方法之后运行，在Servlet被彻底卸载之前
     */
    @PreDestroy
    public void destroy() {
        defaultMQProducer.shutdown();
    }

    public DefaultMQProducer getDefaultMQProducer() {
        return defaultMQProducer;
    }
}